export class ArrayStack<T> {
    /**
     * 保存实际数据
     */
    private _arr: T[];

    constructor() {
        this._arr = [];
    }

    /**
     * 实际数据长度
     */
    public get length(): number {
        return this._arr.length;
    }

    /**
     * 获取所有值
     */
    public get values(): T[] {
        return this._arr;
    }

    /**
     * 是否包含
     * @param item 
     * @returns 
     */
    has(item: T): boolean {
        return this._arr.indexOf(item) !== -1;
    }

    /**
     * 进栈
     * @param item 
     */
    push(item: T): void {
        this._arr.push(item);
    }

    /**
     * 出栈
     * @returns 栈顶元素或 undefined（如果栈为空）
     */
    pop(): T | undefined {
        return this._arr.pop();
    }

    /**
     * 查看栈顶元素
     * @returns 栈顶元素或 undefined（如果栈为空）
     */
    peek(): T | undefined {
        if (this.isEmpty()) {
            return undefined;
        }
        return this._arr[this._arr.length - 1];
    }

    /**
     * 检查栈是否为空
     * @returns 栈是否为空
     */
    isEmpty(): boolean {
        return this._arr.length === 0;
    }

    /**
     * 移除元素
     * @param item 
     */
    remove(item: T) {
        this._arr = this._arr.filter(i => i !== item);
    }

    /**
     * 清空栈
     */
    clear(): void {
        this._arr = [];
    }

    /**
     * 打印栈的内容
     */
    print(): void {
        console.log(this._arr);
    }
}